package GUI;


import javax.swing.JFrame;
import javax.swing.JPanel;


import javax.swing.JFileChooser;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.ImageIcon;
import javax.swing.JDesktopPane;
import javax.swing.GroupLayout;

import javax.swing.BoxLayout;

import java.awt.Color;

import java.awt.ComponentOrientation;
import java.awt.Dimension;

import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import Interfaces.IConstantes;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;

import paquete.Generales;

import java.awt.Font;

/**Crea una clase llamada ventanaPrincipal que va ser la ventana principal de la intefaz, hereda de JFrame
*que es una ventana de una biblioteca de Java y implementa IConstantes que son las imagenes usadas en el 
proyecto*/
public class ventanaPrincipal extends JFrame implements IConstantes  
{
	private JDesktopPane ventana; // Un atributo ventana de tipo JDesktopPane que nos permite abrir otras ventanas sobre esta
	private JMenu menuRegistro;          //
	private JMenu menuConfiguracion;     //
	private JMenu menuAgregar;           // Menus del sistema
	private JMenu menuConsultar;         //
	private JMenu menuSalir;             //
	
	private JPanel panel = new JPanel(); // Se usa como contenedor para guardar objetos aqui creamos un nuevo objeto de este tipo
	private JLabel lblNewLabel; // Atributo para desplegar texto
	private JFileChooser ventaBuscador; // Atributo que nos permite leer o guardar un archivo
	private static ventanaPrincipal miVentanaPrincipal; // Atributo para crear la ventana
	private ImageIcon log = new ImageIcon(imagenLogo);


	// Metodo get para crear un objeto que va ser la ventana principal
	public static ventanaPrincipal getInstance()
	{
		if(miVentanaPrincipal == null)
		{
			miVentanaPrincipal = new ventanaPrincipal();
		}
		return miVentanaPrincipal;
	}
	
    // Metodo para establacer como sera la ventana principal y que cosas tendra 
	private ventanaPrincipal() 
	{
		setTitle("Biblioteca Alejandrina"); // Titulo de la ventana
		setIconImage(Toolkit.getDefaultToolkit().getImage("/Imayarc/Imagenes/logo.png")); // Inserta el icono del logo miniatura en la esquina superior izquierda
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // set para cerrar la ventana
		setBounds(-8, 0, 1296, 760); // Un set donde se ingresan 4 valores los 2 primeros son las coordenas x, y donde aparecera la ventana en la pantalla y los otros 2 el ancho y altura respectivamente
		getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.X_AXIS)); // Hace que en la ventana se coloquen los elementos horizontalmente
		
		
		ventana = new JDesktopPane(); // Constructor llamado ventana del DesktopPane que permite desplegar varias ventanas
		ventana.setBackground(new Color(0, 40, 40 )); // Le da color a ventana
		getContentPane().add(ventana); //A�ade ventana al contenedor
		
		
		// Crea un Label que se usa para mostrar texto en pantalla de la interfaz
		lblNewLabel = new JLabel("");  // Constructor
		lblNewLabel.setFont(new Font("Verdana", Font.PLAIN, 40)); // Ponemos el tipo de letra y tama�o a usar
		
		//Crea un contenedor desplegable para el men� principal
		GroupLayout contVentana = new GroupLayout(ventana); 
		contVentana.setHorizontalGroup( 
				contVentana.createSequentialGroup()
				.addGroup( contVentana.createSequentialGroup()
					.addComponent(lblNewLabel, GroupLayout.PREFERRED_SIZE, 384, GroupLayout.PREFERRED_SIZE)
						)
		);
		
		contVentana.setVerticalGroup(
				contVentana.createSequentialGroup()
				.addGroup(contVentana.createSequentialGroup()
					.addComponent(lblNewLabel, GroupLayout.PREFERRED_SIZE, 68, GroupLayout.PREFERRED_SIZE)
					)
					
		);
		
		
		
		
		ventana.setLayout(contVentana); 
		
		JMenuBar menuPrincipal = new JMenuBar(); // Crea un Menu tipo JMenuBar que es horizontal despegable
		menuPrincipal.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); //Iconos del men� colocados de izquierda a derecha
		menuPrincipal.setBackground(new Color(200, 200, 200)); // Le da color al menu principal 
		setJMenuBar(menuPrincipal);
		
		
		// Crea un objeto de tipo JMenu y lo agrega a menu principal es como un submenu 
		menuRegistro = new JMenu(""); 
		menuRegistro.setIcon(new ImageIcon(imagenLogin)); // Inserta una imagen
		menuPrincipal.add(menuRegistro);
		
		//  Crea la opcion de agregar un nuevo usuario al sistema, es un item del Submenu registro
		JMenuItem itemCrearCuenta = new JMenuItem("Crear cuenta");
		itemCrearCuenta.addActionListener(new ActionListener() { // Cuando se de clic se abra la ventanaRegistro Usuario
			public void actionPerformed(ActionEvent arg0) 
			{
				ventanaRegistroUsuario.getInstance().setVisible(true); // Llama a la ventana Registro usuario
			}
		});
		itemCrearCuenta.setIcon(new ImageIcon(imagenUser));
		itemCrearCuenta.setBackground(new Color(200, 200, 200));
		menuRegistro.add(itemCrearCuenta);
		
		// -El siguiente codigo es para crear otra opcion pero en este caso es iniciar secion, misma logica que el anterior-----//
		JMenuItem itemIniciarSecion = new JMenuItem("Iniciar Sesi�n");
		itemIniciarSecion.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) 
			{
				ventanaLogin.getInstance().setVisible(true);
			}
		});
		itemIniciarSecion.setIcon(new ImageIcon(imagenIniciar));
		itemIniciarSecion.setBackground(new Color(200, 200, 200));
		menuRegistro.add(itemIniciarSecion);
		//-------------------------------------------------------------------------------------------------
		// Codigo similar a los anteriormente mencionados
		JMenuItem itemCerrarSecion = new JMenuItem("Cerrar Sesi�n");
		itemCerrarSecion.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				// codigo
				desactivarAplicacion();
			}
		});
		itemCerrarSecion.setIcon(new ImageIcon(imagenCerrar));
		itemCerrarSecion.setBackground(new Color(200, 200, 200));
		menuRegistro.add(itemCerrarSecion);
		//---------------------------------------------------------------------
		
		//  Crea un nuevo submenu y lo agrega en el menu principal 
		menuConfiguracion = new JMenu(""); // 
		menuConfiguracion.setIcon(new ImageIcon(imagenConfiguracion));
		menuPrincipal.add(menuConfiguracion);
		
		// Al igual que el submenu anterior se le creaban opciones en este caso se crea un configurar preferencias del sistema
		JMenuItem itemconfig = new JMenuItem("Configurar preferencias del sistema");
		itemconfig.setIcon(new ImageIcon(imagenConfig));
		itemconfig.setBackground(new Color(200, 200, 200));
		itemconfig.addActionListener(new ActionListener() { // al hacer clic crea un nuevo objeto de tipo ventanaConfiguracion
			public void actionPerformed(ActionEvent arg0)
			{
				ventanaConfiguracion conf = new ventanaConfiguracion(); 
				ventana.add(conf);
				conf.show();
				mostrarConsultaArticulos(5);
				
			}
		});
		
		menuConfiguracion.add(itemconfig);
		
		
		/*
		 * Adelanto y retroceso de fechas
		 */
		JMenuItem itemdia = new JMenuItem("Avanzar 5 dias");
		itemdia.setIcon(new ImageIcon(imagenDia));
		itemdia.setBackground(new Color(200, 200, 200));
		itemdia.addActionListener(new ActionListener() { // al hacer clic crea un nuevo objeto de tipo ventanaConfiguracion
			public void actionPerformed(ActionEvent arg0)
			{
				Generales.adelantarFechaPor5();
			}
		});
			menuConfiguracion.add(itemdia);

		JMenuItem item30dia = new JMenuItem("Avanzar 30 dias");
		item30dia.setIcon(new ImageIcon(imagenDias));
		item30dia.setBackground(new Color(200, 200, 200));
		item30dia.addActionListener(new ActionListener() { // al hacer clic crea un nuevo objeto de tipo ventanaConfiguracion
			public void actionPerformed(ActionEvent arg0)
			{
				Generales.adelantarFechaPor30();
			}
		});
			menuConfiguracion.add(item30dia);
		
		JMenuItem item1diaAtras = new JMenuItem("Retroceder 5 dias");
		item30dia.setIcon(new ImageIcon(imagenDias));
		item30dia.setBackground(new Color(200, 200, 200));
		item30dia.addActionListener(new ActionListener() { // al hacer clic crea un nuevo objeto de tipo ventanaConfiguracion
			public void actionPerformed(ActionEvent arg0)
			{
				Generales.adelantarFechaPor30();
			}
		});
			menuConfiguracion.add(item1diaAtras);
	
		JMenuItem item30diasAtras = new JMenuItem("Retroceder 30 dias");
		item30dia.setIcon(new ImageIcon(imagenDias));
		item30dia.setBackground(new Color(200, 200, 200));
		item30dia.addActionListener(new ActionListener() { // al hacer clic crea un nuevo objeto de tipo ventanaConfiguracion
			public void actionPerformed(ActionEvent arg0)
			{
				Generales.retrocederFechaPor30();
			}
		});
			menuConfiguracion.add(item30diasAtras);
		
			
		//Crea un nuevo Submenu Agregar para agregar articulos
		menuAgregar = new JMenu("");
		menuAgregar.setIcon(new ImageIcon(imagenAgregar));
		menuPrincipal.add(menuAgregar);
		
		// Codigo similar a anteriores ya explicados
		JMenuItem itemAgregarPersona = new JMenuItem("Agregar persona");
		itemAgregarPersona.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				ventanaAgregarPersona.getInstance().setVisible(true);
			}
		});
		itemAgregarPersona.setBackground(new Color(200, 200, 200));
		itemAgregarPersona.setIcon(new ImageIcon(imagenPersona));
		menuAgregar.add(itemAgregarPersona);
		
		JMenuItem itemAgregarArticulo = new JMenuItem("Agregar art�culo");
		itemAgregarArticulo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				ventanaAgregarArticulo.getInstance().cambiarComboBox(); // Llama a metodos de agregar articulo
				ventanaAgregarArticulo.getInstance().setVisible(true);
			}
		});
		itemAgregarArticulo.setIcon(new ImageIcon(imagenArticulos));
		itemAgregarArticulo.setBackground(new Color(200, 200, 200));
		menuAgregar.add(itemAgregarArticulo);
		
		// Item para agregar otro tipo de posesion 
		JMenuItem itemAgregarTipoPosesion = new JMenuItem("Agregar tipo de posesi�n ");
		itemAgregarTipoPosesion.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				ventanaAgregarTipoPosesion .getInstance().setVisible(true);
			}
		});
		itemAgregarTipoPosesion.setIcon(new ImageIcon(imagenPosesion));
		itemAgregarTipoPosesion.setBackground(new Color(200, 200, 200));
		menuAgregar.add(itemAgregarTipoPosesion);
		
		// Item para agregar personas desde un archivo
		JMenuItem itemAgregarPersonasArchivo = new JMenuItem("Agregar personas desde un archivo");
		itemAgregarPersonasArchivo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)  // Metodo para detectar y manejar eventos de accion en este caso la busqueda de un archivo
			{
				int respuesta = ventaBuscador.showOpenDialog(miVentanaPrincipal);
		        if (respuesta == JFileChooser.APPROVE_OPTION)
		        	{
		        		//Codigo
			        }		
			}
		});
		itemAgregarPersonasArchivo.setBackground(new Color(200, 200, 200));
		itemAgregarPersonasArchivo.setIcon(new ImageIcon(imagenPersona));
		menuAgregar.add(itemAgregarPersonasArchivo);
		
		
		// Item para agregar libros desde un archivo
		JMenuItem itemAgregarlibrosArchivo = new JMenuItem("Agregar Libros desde un archivo");
		itemAgregarlibrosArchivo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0)
			{
				int respuesta = ventaBuscador.showOpenDialog(miVentanaPrincipal);
		        if (respuesta == JFileChooser.APPROVE_OPTION)
		        	{
		        		//codigo
			        }		
	        }
			});
		itemAgregarlibrosArchivo.setIcon(new ImageIcon(imagenLibros));
		itemAgregarlibrosArchivo.setBackground(new Color(200, 200, 200));
		menuAgregar.add(itemAgregarlibrosArchivo);
		
		//Item para revistas 
		JMenuItem ItemAgregarRevistasArchivo = new JMenuItem("Agregar revistas desde un archivo");
		ItemAgregarRevistasArchivo.setBackground(new Color(200, 200, 200));
		ItemAgregarRevistasArchivo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				int respuesta = ventaBuscador.showOpenDialog(miVentanaPrincipal);
		        if (respuesta == JFileChooser.APPROVE_OPTION)
		        	{
		        		//codigo
			        }		
				// agregar revistas desde archivo txt
			}
		});
		ItemAgregarRevistasArchivo.setIcon(new ImageIcon(imagenRevista));
		menuAgregar.add(ItemAgregarRevistasArchivo);
		
		
		// Item para peliculas 
		JMenuItem ItemAgregarPeliculasArchivo = new JMenuItem("Agregar pel�culas desde un archivo");
		ItemAgregarPeliculasArchivo.setBackground(new Color(200, 200, 200));
		ItemAgregarPeliculasArchivo.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) 
			{
				int respuesta = ventaBuscador.showOpenDialog(miVentanaPrincipal);
		        if (respuesta == JFileChooser.APPROVE_OPTION)
		        	{
		        		//
			        }		
			}
		});
		ItemAgregarPeliculasArchivo.setIcon(new ImageIcon(imagenPelicula));
		menuAgregar.add(ItemAgregarPeliculasArchivo);
		
		
		// Nuevo submenu para consultas de articulos 
		menuConsultar = new JMenu("");
		menuConsultar.setIcon(new ImageIcon(imagenRevisar));
		menuPrincipal.add(menuConsultar);
		
		JMenuItem ItemTop = new JMenuItem("Top 10 ");
		ItemTop.setIcon(new ImageIcon(imagenArticulos));
		ItemTop.setBackground(new Color(200, 200, 200));
		menuConsultar.add(ItemTop);
		
		JMenuItem ItemListaArticulos= new JMenuItem("Lista de art�culos");
		ItemListaArticulos.setIcon(new ImageIcon(imagenArticulos));
		ItemListaArticulos.setBackground(new Color(200, 200, 200));
		menuConsultar.add(ItemListaArticulos);
		
		JMenuItem ItemListaArticulosPrestados = new JMenuItem("Lista de art�culos prestados");
		ItemListaArticulosPrestados.setIcon(new ImageIcon(imagenArticulos));
		ItemListaArticulosPrestados.setBackground(new Color(200, 200, 200));
		menuConsultar.add(ItemListaArticulosPrestados);
		
		JMenuItem ItemListaArticulosNoPrestados= new JMenuItem("Lista de art�culos no prestados");
		ItemListaArticulosNoPrestados.setIcon(new ImageIcon(imagenArticulos));
		ItemListaArticulosNoPrestados.setBackground(new Color(200, 200, 200));
		menuConsultar.add(ItemListaArticulosNoPrestados);
		
		//Menu para salir
		menuSalir = new JMenu("");
		menuSalir.addMouseListener(new MouseAdapter() { 
			@Override
			public void mouseClicked(MouseEvent arg0)  // metodo para cuando se hace click terminar el sistema
			{
				System.exit(0);
			}
		});
		menuSalir.setIcon(new ImageIcon(imagenSalir));
		menuPrincipal.add(menuSalir);
		
		/*
		 * 
		 * aPLICACIÓN DESACTIVADA POR 
		 * 
		 * DEFECTO PARA EFECTOS
		 * 
		 * DE TESTING
		 * 		|	
		 * 		|
		 * 		|
		 * 		|
		 * 		V
		 */
		//desactivarAplicacion(); // Mantiene los menus configuracion, agregar y consultar desahibilitados

		
		/* Label cuyo objetivo es correr espacios en blanco para insertar el logo al final del contenedor */
		JLabel espacio = new JLabel("                                                                                                                                                                                                                            ");
		menuPrincipal.add(espacio);
		
		JLabel imagenlogo = new JLabel(""); // Etiqueta de texto vacia para insertar el icono
		imagenlogo.setIcon(new ImageIcon(log.getImage().getScaledInstance(100, 100, 10000))); // agrega la imagen del logo
		menuPrincipal.add(imagenlogo); // agrega componente
		
		ventaBuscador = new JFileChooser(); //Crea un objeto de tipo JFileChooser llamado ventaBuscador para busqueda de archivos
		
		ventana.add(ventanaRegistroUsuario.getInstance());
		ventana.add(ventanaLogin.getInstance());
		ventana.add(ventanaAgregarPersona.getInstance());
		ventana.add(ventanaAgregarTipoPosesion .getInstance());
		ventana.add(ventanaAgregarArticulo.getInstance());
		//mostrarConsultaArticulos(10);
		setVisible(true);
	}
	
	public void activarAplicacion() // Habilita las ventanas
	{
		
		menuConfiguracion.setEnabled(true);
		menuAgregar.setEnabled(true);
		menuConsultar.setEnabled(true);
		lblNewLabel.setText(" �Bienvenido!"); 
	}
	
	public void desactivarAplicacion()
	{
		menuConfiguracion.setEnabled(false);
		menuAgregar.setEnabled(false);
		menuConsultar.setEnabled(false);
		lblNewLabel.setText("");
	}
	
	
	private void mostrarConsultaArticulos(int x)
	{
		int y = 0;
		for(int i = 0;i<x;i++)
		{
			panel.add(new panelArticulo(y));
			y+=165;
		}//recordar poner el panel en absolute layout
		panel.setPreferredSize(new Dimension(342,y));
		panel.setLayout(null);
	}
}
